# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/11/1
# @File : 30.（状态压缩、数位）E - Get Everything.py
Max = float("inf")

n,m = map(int,input().split())

dp = [[Max] * (1<<n) for _ in range(m+1)]
#从0000...0000到1111...1111有2的n次方种方案,后面的方案可以由前面的方案转移过来,最终要求1111...1111的最小花费
dp[0][0] = 0 #用0把钥匙开0个盒子的最小价钱是0

for i in range(m):
    money , _ = map(int,input().split())
    mask = 0
    for c in list(map(int,input().split())):
        mask |= 1<<(c-1)#把当前钥匙能开的盒子求并集得到一种方案,减一是因为c从1开始,这里往前推一位方便计算,注意不能直接或上c,因为比如c是3,表示就是0010000这样,但是这个数是4.
    for j in range(1<<n):#卧槽这里太难了！！注意到：每个 j|mask 是有可能被更新两遍的，因为 2或2 = 2 0或2 也是=2。所以每个值一共被三个值更新，但是三个里面的两个其实是有大小之分的了，即dp[i][j]和dp[i][j]+money
        dp[i+1][j]=min(dp[i+1][j],dp[i][j])
        dp[i+1][j|mask] = min(dp[i][j]+money,dp[i+1][j|mask])
"""
2的12次方很小,所以可以用4096个表示所有可能的方案,12个bit,0表示不开 1表示开.
"""
#不要忘记如果没有被更新的,要直接等于上一行的值,这个时候就用一维数组其实没那么复杂.
print(dp[-1][-1] if dp[-1][-1] != Max else -1)

